/**
 * 前端通用工具函数库
 */

const utils = {
  // ======================== URL 相关 ========================
  
  /**
   * 获取 URL 查询参数对象
   * @returns {Object} 参数键值对
   */
  getQueryParams() {
    return Object.fromEntries(new URLSearchParams(window.location.search));
  },

  /**
   * 获取指定 URL 参数值
   * @param {string} name - 参数名
   * @returns {string|null} 参数值
   */
  getQueryParam(name) {
    return new URLSearchParams(window.location.search).get(name);
  },

  // ======================== 数据处理 ========================
  
  /**
   * 深拷贝对象/数组
   * @param {Object|Array} obj - 要拷贝的对象
   * @returns {Object|Array} 深拷贝后的新对象
   */
  deepClone(obj) {
    if (obj === null || typeof obj !== 'object') return obj;
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);
    
    const clone = Array.isArray(obj) ? [] : {};
    for (const key in obj) {
      if (Object.hasOwnProperty.call(obj, key)) {
        clone[key] = this.deepClone(obj[key]);
      }
    }
    return clone;
  },

  /**
   * 对象转 URL 查询字符串
   * @param {Object} params - 参数对象
   * @returns {string} 查询字符串
   */
  stringifyParams(params) {
    return new URLSearchParams(params).toString();
  },

  // ======================== 格式转换 ========================
  
  /**
   * 金额格式化（添加千位分隔符）
   * @param {number} num - 数值
   * @param {number} decimals - 保留小数位数
   * @returns {string} 格式化后的金额
   */
  formatMoney(num, decimals = 2) {
    return Number(num).toFixed(decimals).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  },

  /**
   * 手机号脱敏处理
   * @param {string} phone - 手机号码
   * @returns {string} 脱敏后的手机号
   */
  maskPhone(phone) {
    return phone.replace(/(\d{3})\d{4}(\d{4})/, '$1****$2');
  },

  // ======================== DOM 操作 ========================
  
  /**
   * 切换元素类名
   * @param {HTMLElement} el - DOM元素
   * @param {string} className - 类名
   */
  toggleClass(el, className) {
    el.classList.toggle(className);
  },

  /**
   * 获取元素样式
   * @param {HTMLElement} el - DOM元素
   * @param {string} styleName - 样式属性名
   * @returns {string} 样式值
   */
  getStyle(el, styleName) {
    return window.getComputedStyle(el)[styleName];
  },

  // ======================== 功能函数 ========================
  
  /**
   * 函数防抖
   * @param {Function} fn - 目标函数
   * @param {number} delay - 延迟时间(ms)
   * @returns {Function} 防抖处理后的函数
   */
  debounce(fn, delay = 300) {
    let timer = null;
    return function(...args) {
      timer && clearTimeout(timer);
      timer = setTimeout(() => fn.apply(this, args), delay);
    };
  },

  /**
   * 函数节流
   * @param {Function} fn - 目标函数
   * @param {number} interval - 时间间隔(ms)
   * @returns {Function} 节流处理后的函数
   */
  throttle(fn, interval = 300) {
    let lastTime = 0;
    return function(...args) {
      const now = Date.now();
      if (now - lastTime >= interval) {
        fn.apply(this, args);
        lastTime = now;
      }
    };
  },

  // ======================== 浏览器存储 ========================
  
  /**
   * 获取 Cookie 值
   * @param {string} name - Cookie名称
   * @returns {string|null} Cookie值
   */
  getCookie(name) {
    const cookies = document.cookie.split('; ');
    const cookie = cookies.find(c => c.startsWith(`${name}=`));
    return cookie ? decodeURIComponent(cookie.split('=')[1]) : null;
  },

  /**
   * 设置 Cookie
   * @param {string} name - 名称
   * @param {string} value - 值
   * @param {number} days - 有效期天数
   */
  setCookie(name, value, days = 7) {
    const date = new Date();
    date.setTime(date.getTime() + days * 24 * 60 * 60 * 1000);
    document.cookie = `${name}=${encodeURIComponent(value)};expires=${date.toUTCString()};path=/`;
  },

  // ======================== 类型判断 ========================
  
  /**
   * 判断是否为对象
   * @param {any} obj - 要判断的值
   * @returns {boolean}
   */
  isObject(obj) {
    return Object.prototype.toString.call(obj) === '[object Object]';
  },

  /**
   * 判断是否为数组
   * @param {any} arr - 要判断的值
   * @returns {boolean}
   */
  isArray(arr) {
    return Array.isArray(arr);
  },

  // ======================== 其他工具 ========================
  
  /**
   * 生成随机ID
   * @param {number} length - ID长度
   * @returns {string} 随机ID
   */
  generateID(length = 8) {
    return Math.random().toString(36).substr(2, length);
  },

  /**
   * 复制文本到剪贴板
   * @param {string} text - 要复制的文本
   */
  copyToClipboard(text) {
    const input = document.createElement('textarea');
    input.value = text;
    document.body.appendChild(input);
    input.select();
    document.execCommand('copy');
    document.body.removeChild(input);
  }
};

export default utils;